/**
 *  Created on: Dec 28, 2012
 *      Author: filipe mutz
 */

#include <iostream>

using namespace std;

/**
 *
 * Pergunta: Como criar uma classe com um metodo abstrata que
 * deve ser implementado pelas classes filhas sem restringir
 * o numero de parametros do metodo?
 *
 * Resposta: Implemente o metodo de forma privada na classe
 * filha e defina o metodo com um numero diferente de parametros
 * como publico. Assim o usuario so tera acesso ao metodo
 * com o numero diferente de parametros.
 *
 * Nota: Isso tem cara de gambiarra :/
 *
 * TODO: Pesquisar se existe outra forma de fazer isso.
 *
 */

class ClusteringAlgorithm
{
	public:

		virtual void cluster() = 0;
};


class SupervisionedClusteringAlgorithm:ClusteringAlgorithm
{
	void cluster() {}

	public:
		SupervisionedClusteringAlgorithm() {}
		~SupervisionedClusteringAlgorithm() {}

		void cluster(double **data, int *classes) {}
};


class UnsupervisionedClusteringAlgorithm:ClusteringAlgorithm
{
	void cluster() {}

	public:
		UnsupervisionedClusteringAlgorithm() {}
		~UnsupervisionedClusteringAlgorithm() {}

		void cluster(double **data) {}
};


int
main(void)
{
	SupervisionedClusteringAlgorithm super_cluster;
	UnsupervisionedClusteringAlgorithm unsuper_cluster;

	super_cluster.cluster(NULL, NULL);
	unsuper_cluster.cluster(NULL);

	cout << "Terminou!" << endl;
	return 0;
}
